package com.saybiu.service.serviceImpl;

import com.saybiu.dao.*;
import com.saybiu.domain.*;
import com.saybiu.exception.ServiceException;
import com.saybiu.response.CommonCode;
import com.saybiu.service.UserService;
import com.saybiu.utils.Utils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.xml.crypto.Data;
import java.util.Date;
import java.util.List;

/**
 * @Author wangwei
 * @Date 2021/4/18 12:54
 * @Version 1.0
 */
@Service
public class UserServiceImpl implements UserService {
    @Resource
    private UserMetaDao userMetaDao;
    @Resource
    private SupportDao supportDao;
    @Resource
    private  UserDao userDao;
    @Resource
    private CollectionDao collectionDao;
    @Resource
    private LikeDao likeDao;
    /**
     * 用户注册
     * @param user 用户注册信息
     *        注册ip   注册时间  更新时间  user表
     *        用户id 性别  昵称  头像url 最近登录ip
     * 事务处理
     * 影响bbs_users和bbs_usermeta表
     */
    @Override
    public void register(User user,UserMeta userMeta) {
        //System.out.println(user);
        User sqlUser = userDao.selectUserByUser(user);
        //System.out.println(sqlUser);
        if (sqlUser!=null){
            throw new ServiceException(CommonCode.INSERT_REPEAT,"该号码已经注册,请登录!");
        }
        //手机号  注册ip   时间(注册时间 更新时间)  user表
        //设置时间
        String time = Utils.toDate(new Date());
        //注册时间
        user.setUserCreateTime(time);
        //更新时间
        user.setUserUpdateTime(time);
        try{
            userDao.insertUser(user);
        }catch (Exception e){
            e.printStackTrace();
            //插入失败
            throw new ServiceException(CommonCode.INSERT_ERROR,"注册失败!");
        }
        userMeta.setUserId(user.getUserId());
        //性别 昵称  头像url 最近登录ip usermeta表
        int result2 = userMetaDao.insertUserMeta(userMeta);
        if (result2==0){
            //插入数据失败
            throw new ServiceException(CommonCode.INSERT_ERROR,"注册失败");
        }
    }
    /**
     * 待定
     * 用户登录(通过电话号和密码验证)
     * @param user
     * @param UserLatestIp 用户最近登录ip(用户属性表中查)
     * @return 返回用户id
     * 事务处理
     */
    @Override
    public Boolean login(User user, String UserLatestIp) {
        //通过id查询密码
        //用户登录   通过验证 手机号  密码
         User u = userDao.selectUserByNumAndPwd(user.getUserPhone(),user.getUserPassword());
        // 最近登录ip(更新)
        return false;
    }

    /**
     * 已对接
     * 修改用户所有属性根据用户id(性别  头像  昵称)
     * @param userMeta 用户属性对象
     */
    @Override
    public void updateUserMeta(UserMeta userMeta) {
        int result = 0;
        //通过userid更新用户属性信息
        try{
            result = userMetaDao.updateUserMeata(userMeta);
        }catch (Exception e){
            throw  new ServiceException(CommonCode.INVALID_PARAM);
        }
        if (result==0){
            throw  new ServiceException(CommonCode.UPDATE_ERROR,"更新用户属性信息失败");
        }
    }

    /**
     * 已对接
     * 通过id修改用户信息手机号或者密码
     * @param user 用户对象(userid  手机号或者密码)
     */
    @Override
    public void updatePhoneOrPassword(User user) {
        //设置更新时间
        user.setUserUpdateTime(Utils.toDate(new Date()));
        User u = userDao.selectUser(user.getUserId());
        //如果数据库中密码为null 赋空值
        String password = u.getUserPassword();
        if(password==null){
            password = "";
        }
        //先判断密码或者电话号是否和之前一样
        if(u.getUserPhone().equals(user.getUserPhone())||password.equals(user.getUserPassword())){
            throw new ServiceException(CommonCode.INSERT_REPEAT,"与原来相同,请换一个");
        }
        int result = 0;
        //通过用户id更新手机号码
        try{
             result = userDao.updatePhoneOrPasswordById(user);
        }catch (Exception e){
            throw new ServiceException(CommonCode.INVALID_PARAM);
        }
        if (result==0){
            throw new ServiceException(CommonCode.SELECT_ERROR);
        }

    }

    /**
     * 已对接
     * 关注他人
     * @param userId 用户id
     * @param beSupportedUserId 被关注人的id
     * 做事务处理
     * 影响bbs_userMeta和bbs_supports表
     */
    @Override
    public void addUserSupportAndUserBeSupported(Integer userId, Integer beSupportedUserId) {
        //通过userid更新用户属性表关注数量
        int result1 = userMetaDao.addSupportNum(userId);
        //通过beSupportedUserId更新用户粉丝数量
        int result2 = userMetaDao.addSupportedNum(beSupportedUserId);
        if (result1==0||result2==0) {
            throw new ServiceException(CommonCode.UPDATE_ERROR);
        }
        //通过两个id在usermeta表查询用户昵称以及被关注人昵称
        UserMeta userMeta1 = userMetaDao.queryUserMeta(userId);
        UserMeta userMeta2 = userMetaDao.queryUserMeta(beSupportedUserId);
        if (userMeta1==null||userMeta2==null){
            throw new ServiceException(CommonCode.SELECT_ERROR,"不存在关注关系");
        }
        //先查询关注关系是否存在
        Support support = supportDao.selectSupportByUserIdAndBeSupportedUserId(userId, beSupportedUserId);
        //存在抛异常
        if (support!=null){
            throw  new ServiceException(CommonCode.INSERT_REPEAT,"已经关注,不能重复关注");
        }
        //插入数据
        //将内容(两个id 两个昵称 时间)插入关注表
        String str1 = userMeta1.getUserNickName();
        String str2 = userMeta2.getUserNickName();
        int i = supportDao.insertSupport(userId, str1, beSupportedUserId, str2, Utils.toDate(new Date()));
        if (i==0){
            throw  new ServiceException(CommonCode.INSERT_ERROR,"关注失败");
        }
    }
    /**
     * 已对接
     * 取消关注
     * @param userId 用户id
     * @param beSupportUserId 被关注人id
     * 做事务处理
     * 影响bbs_userMeta和bbs_supports表
     */
    @Override
    public void deleteUserSupportAndUserBeSupported(Integer userId, Integer beSupportUserId) {
        //通过userid更新用户属性表关注数量
        int result1 = userMetaDao.subSupportNum(userId);
        //通过beSupportUserId更新用户属性表粉丝数量
        int result2 = userMetaDao.subSupportedNum(beSupportUserId);
        if (result1==0||result2==0) {
            throw new ServiceException(CommonCode.UPDATE_ERROR);
        }
        //查询是否有关注关系
        Support support = supportDao.selectSupportByUserIdAndBeSupportedUserId(userId, beSupportUserId);
        if (support==null){
            throw  new ServiceException(CommonCode.FAIL,"不存在关注关系");
        }
        //删除关注表中的关注人
        int i = supportDao.deleteSupport(userId,beSupportUserId);
        if (i==0){
            throw new ServiceException(CommonCode.DELETE_ERROR,"删除关注人失败");
        }
    }

//    /**
//     *
//     * 查询关注人
//     * @param userId 当前用户id
//     * @param beSupportUserId 被查询用户id
//     * @return support对象
//     */
//    @Override
//    public UserMeta querySupportRelation(Integer userId, Integer beSupportUserId) {
//        //用户id和被关注人id
//        Support support = supportDao.selectSupportByUserIdAndBeSupportedUserId(userId, beSupportUserId);
//        return null;
//    }

    /**
     * 查询用户信息
     * @param userId 用户id
     * @return 用户信息
     */
    @Override
    public User queryUser(Integer userId) {
        //通过id查询用户信息
        User user = userDao.selectUser(userId);
        return user;
    }
    /**
     * 查询用户属性信息
     * @param userId 用户id
     * @return 返回该用户的属性实体
     * 操作bbs_usermeta表
     */
    @Override
    public UserMeta queryUserMeta(Integer userId) {
        //通过id查询用户属性信息
        UserMeta userMeta = userMetaDao.queryUserMeta(userId);
        return userMeta;
    }
    /**
     * 查询用户关注人或者用户粉丝
     * 传userid查主动关注人   传beSupportedUserId查粉丝
     * @param userId 用户id 可为null
     * @param beSupportedUserId 粉丝id 可为null
     * @return
     * 操作bbs_supports表
     */
    @Override
    public List<Support> queryUserSupportAndBeSupported(Integer userId, Integer beSupportedUserId) {
        //通过id查询关注的人或者粉丝
        List<Support> supports = supportDao.selectSupport(userId,beSupportedUserId);
        return supports;
    }
    /**
     * 查询用户收藏信息
     * @param userId 用户id
     * @return 返回该用户收藏信息实体
     * 操作bbs_collections表
     */
    @Override
    public List<Collection> queryUserCollection(Integer userId) {
        //通过用户id查询收藏信息
        List<Collection> collections = collectionDao.selectCollections(userId);
        return collections;
    }
    /**
     * 查询用户点赞和被点赞
     * @param userId 用户id
     * @param beLikedUserId 被点赞人id
     * @return
     * 操作bbs_likes表
     */
    @Override
    public List<Like> queryUserLikeAndBeLiked(Integer userId, Integer beLikedUserId) {
        //通过id查询被点赞或者点赞
        List<Like> likes = likeDao.selectLikes(userId,beLikedUserId);
        return likes;
    }
}
